home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 476-500 / disk_488 / lordofhosts / lohsrc.lzh / board.c next >
C/C++ Source or Header  |  1991-05-10  |  6KB  |  189 lines

  1. /* LORD OF HOSTS - board.c --- Spielfeld generieren */
  2.  
  3. #include "Lord.h"
  4.  
  5. extern int NumPieces[2];
  6. extern struct Move Moves[MAXUNDO];
  7. extern int undopos,redotop,undobot,status,last_error;
  8.  
  9. int type_of_board;
  10. UBYTE pdesc [16][4] =       /* 16 Steine, 4 Werte, die jeden Stein
  11. kennzeichnen.  Die vier Werte sind die Schrittwerte, die die Steine auf den
  12. Feldern (0,0),(1,0),(4,0) und (5,0) haben.  Daraus lassen sich alle anderen
  13. ableiten. Drehung des Feldes um 90° bewirkt Vertauschung der Wertepaare */
  14. {
  15.    { 1,1, 2,2 },  /* roter King */
  16.    { 4,1, 3,2 },  /* roter Knight 1 */
  17.    { 4,1, 3,2 },  /*   "      "    2 */
  18.    { 3,2, 4,1 },  /* etc. */
  19.    { 3,2, 4,1 },
  20.    { 2,4, 3,1 },
  21.    { 2,4, 3,1 },
  22.    { 2,4, 3,1 },
  23.    { 2,2, 1,1 },  /* weißer King */
  24.    { 3,1, 2,4 },  /* etc. */
  25.    { 3,1, 2,4 },
  26.    { 3,1, 2,4 },
  27.    { 4,1, 3,2 },
  28.    { 4,1, 3,2 },
  29.    { 3,2, 4,1 },
  30.    { 3,2, 4,1 },
  31. };
  32.  
  33. UBYTE fval[16][8][8]; /* Werte der Spielfelder für die Steine */
  34. UBYTE kval[16][8][8]; /* Werte, die (durch Daraufziehen) bereits den
  35.       Spielern bzw. dem Computer bekannt sind. 16=Anzahl der Steine, 8,8= x,y */
  36. UBYTE whatsonboard[8][8];
  37. struct Piece ThePieces[16]; /* Spielsteine */
  38.  
  39. void setup_stdboard(BOOL Rotated) /* BOOL=TRUE : Brett um 90° gedreht */
  40. {
  41.    int p,i,rot= (Rotated) ? 4 : 0;
  42.    clear_board();
  43.    for (p=0; p<=15; ++p)            /* Spielsteine 0 - 15 */
  44.    {
  45.       for (i=0; i<=3; i+=2)         /* y-Koord. 0 - 3 */
  46.       {
  47.          /* Zeilen 0 und 2 sind identisch */
  48.          fval[p][0+rot][i] = fval[p][2+rot][i] = pdesc[p][0];
  49.          fval[p][1+rot][i] = fval[p][3+rot][i] = pdesc[p][1];
  50.          fval[p][4-rot][i] = fval[p][6-rot][i] = pdesc[p][2];
  51.          fval[p][5-rot][i] = fval[p][7-rot][i] = pdesc[p][3];
  52.          /* Zeilen 1 und 3 auch */
  53.          fval[p][0+rot][i+1] = fval[p][2+rot][i+1] = pdesc[p][3];
  54.          fval[p][1+rot][i+1] = fval[p][3+rot][i+1] = pdesc[p][2];
  55.          fval[p][4-rot][i+1] = fval[p][6-rot][i+1] = pdesc[p][1];
  56.          fval[p][5-rot][i+1] = fval[p][7-rot][i+1] = pdesc[p][0];
  57.       }
  58.       for (i=4; i<=7; i+=2)      /* y-Koord. 4 - 7 */
  59.       {
  60.          /* Zeilen 4 und 6 sind identisch */
  61.          fval[p][0+rot][i] = fval[p][2+rot][i] = pdesc[p][2];
  62.          fval[p][1+rot][i] = fval[p][3+rot][i] = pdesc[p][3];
  63.          fval[p][4-rot][i] = fval[p][6-rot][i] = pdesc[p][0];
  64.          fval[p][5-rot][i] = fval[p][7-rot][i] = pdesc[p][1];
  65.          /* Zeilen 5 und 7 auch */
  66.          fval[p][0+rot][i+1] = fval[p][2+rot][i+1] = pdesc[p][1];
  67.          fval[p][1+rot][i+1] = fval[p][3+rot][i+1] = pdesc[p][0];
  68.          fval[p][4-rot][i+1] = fval[p][6-rot][i+1] = pdesc[p][3];
  69.          fval[p][5-rot][i+1] = fval[p][7-rot][i+1] = pdesc[p][2];
  70.       }
  71.    }
  72.    InitPiece(0,RKING,GetValue(0,4,7),4,7);
  73.    for (i=1; i<=7; ++i)
  74.    {
  75.       do p = rand() % 8; while (IsOccupied(p,7) != NOT_OCCUPIED);
  76.       InitPiece(i,RKNIGHT,GetValue(i,(UBYTE)p,7),(UBYTE)p,7);
  77.    }
  78.  
  79.    InitPiece(8,WKING,GetValue(8,3,0),3,0);
  80.    for (i=9; i<=15; ++i)
  81.    {
  82.       do p = rand() % 8; while (IsOccupied(p,0) != NOT_OCCUPIED);
  83.       InitPiece(i,WKNIGHT,GetValue(i,(UBYTE)p,0),(UBYTE)p,0);
  84.    }
  85.    for (i=0; i<=15; ++i)
  86.       SetPiece(ThePieces[i],FALSE,FALSE);
  87.    if (!Rotated) type_of_board = STD_NORM;
  88.    else type_of_board = STD_ROTD;
  89. }
  90.  
  91. void setup_rndboard(BOOL Balanced)
  92. {
  93.    int p,i,j,top,r;
  94.    UBYTE nums[64];
  95.    clear_board();
  96.    if (! Balanced)                           /* reiner Zufall */
  97.    {
  98.       for (p=0; p<=15; ++p)
  99.          for (i=0; i<=7; ++i)
  100.             for (j=0; j<=7; ++j)
  101.                if (p % 8)              /* Kein King */
  102.                   fval[p][i][j] = (rand() % 4) +1;
  103.                else
  104.                   fval[p][i][j] = (rand() % 2) +1;
  105.    }
  106.    else           /* balancierter Zufall, d.h. jede Nummer kommt in jedem */
  107.    {              /* Stein gleich oft vor */
  108.       for (p=0; p<=15; ++p)
  109.       {
  110.          for (i=0; i<=15; ++i)  /* Nummerntabelle */
  111.          {
  112.             nums[i] = 1;
  113.             nums[i+16] = 2;
  114.             nums[i+32] = (p % 8) ? 3 : 1;  /* King kann 1 oder 2 ziehen */
  115.             nums[i+48] = (p % 8) ? 4 : 2;
  116.          }
  117.          top = 63;
  118.          for (i=0; i<=7; ++i)
  119.             for (j=0; j<=7; ++j)
  120.             {
  121.                r = rand() % (top+1);     /* Zufallszahl zw. 0 und top */
  122.                fval[p][i][j] = nums[r];
  123.                nums[r] = nums[top]; /* Tabelle erneuern */
  124.                --top;
  125.             }
  126.       }
  127.    }
  128.    InitPiece(0,RKING,GetValue(0,4,7),4,7);
  129.    for (i=1; i<=7; ++i)
  130.    {
  131.       do p = rand() % 8; while (IsOccupied(p,7) != NOT_OCCUPIED);
  132.       InitPiece(i,RKNIGHT,GetValue(i,(UBYTE)p,7),(UBYTE)p,7);
  133.    }
  134.  
  135.    InitPiece(8,WKING,GetValue(8,3,0),3,0);
  136.    for (i=9; i<=15; ++i)
  137.    {
  138.       do p = rand() % 8; while (IsOccupied(p,0) != NOT_OCCUPIED);
  139.       InitPiece(i,WKNIGHT,GetValue(i,(UBYTE)p,0),(UBYTE)p,0);
  140.    }
  141.    for (i=0; i<=15; ++i)
  142.       SetPiece(ThePieces[i],FALSE,FALSE);
  143.    if (Balanced) type_of_board = RND_BAL;
  144.    else type_of_board = RND_UNB;
  145. }
  146.  
  147. UBYTE GetValue(int Num, UBYTE x, UBYTE y)
  148. {
  149.    return fval[Num][x][y];
  150. }
  151.  
  152. UBYTE IsOccupied(UBYTE x, UBYTE y)
  153. {
  154.    if (whatsonboard[x][y]<16) return whatsonboard[x][y];
  155.    else return(NOT_OCCUPIED);
  156. }
  157.  
  158. void InitPiece(int Num, int ID, int Val, UBYTE x, UBYTE y)
  159. {
  160.    ThePieces[Num].Number = Num;
  161.    ThePieces[Num].ID = ID;
  162.    ThePieces[Num].Value = Val;
  163.    ThePieces[Num].x = x;
  164.    ThePieces[Num].y = y;
  165.    ThePieces[Num].StillAlive = TRUE;
  166.    whatsonboard[x][y] = Num;
  167.    kval[Num][x][y] = Val;     /* bekannter Zugwert */
  168. }
  169.  
  170. void clear_board(void)   /* Alles für Spielbeginn herrichten */
  171. {
  172.    int h,i,j;
  173.    for (h=0; h<=15; ++h)
  174.       for (i=0; i<=7; ++i)
  175.          for (j=0; j<=7; ++j)
  176.             kval[h][i][j] = 0;  /* Feld mit bekannten Zugwerten löschen */
  177.    for (h=0; h<=7; ++h)
  178.       for (i=0; i<=7; ++i)
  179.          whatsonboard[h][i] = NOT_OCCUPIED;
  180.    NumPieces[0] = NumPieces[1] = 8;
  181.    undopos = redotop = undobot = 0;
  182.    for (i=0; i<MAXUNDO; ++i)
  183.    {
  184.       Moves[i].fromx = Moves[i].tox = Moves[i].fromy = Moves[i].toy = 0;
  185.       Moves[i].x_first = FALSE;
  186.       Moves[i].Beaten = NOBODY;
  187.    }
  188.    status = IDLE|BOARD_UNTOUCHED; last_error = 0;
  189. }